package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * JAVA反射机制
 * 反射是JAVA的动态机制，可以在程序【运行期间】再确定如:对象实例化，方法调用
 * 属性操作等。
 * 反射机制可以大大的提高代码的灵活度和可扩展性，但是随之带来的是较慢的运行
 * 效率和更多的系统开销。因此不能过度依赖反射机制。
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            Class类
            Class类的实例被称为"类对象"。
            JVM在加载一个类的字节码文件到内部时就会实例化一个Class实例
            与加载的类对应，用这个Class实例记录加载的类的相关信息。并且
            在JVM内部每个被加载的类【都有且只有一个】类对象与之对应。

            获取一个类的类对象方式有:
            1:类名.class
            Class cls = String.class;
            Class cls = int.class;

            2.Class.forName(String className)
              参数:类的完全限定名(包名.类名)
            Class cls = Class.forName("java.lang.String")

            3:使用ClassLoader加载
         */
        //获取String的类对象
        Class cls = String.class;
        String name = cls.getName();//获取类的完全限定名
        System.out.println(name);
        name = cls.getSimpleName();//仅获取类名
        System.out.println(name);
        /*
            Method类
            Method类的每一个实例称为"方法对象"。
            该类的每个实例表示某个类中的一个方法。通过方法对象我们可以得知
            其表示的方法的相关信息，如:方法名，返回值类型，参数个数，参数类型
            等等。
         */
        /*
            Class中的方法:
            Method[] getMethods()
            获取当前类对象所表示的类的所有公开方法
         */
        Method[] methods = cls.getMethods();
        System.out.println(name+"一共有"+methods.length+"个公开方法");
        for(Method method : methods){
            System.out.println(method.getName());
        }
        Class per = Class.forName("reflect.Person");
        String name1 = per.getSimpleName();//仅获取类名
        name1 = per.getSimpleName();//仅获取类名
        Method[] methods1 = per.getMethods();
        System.out.println(name1+"一共有"+methods1.length+"个公开方法");
        for(Method method1 : methods1){
            System.out.println(method1.getName());
        }

        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        Class b = Class.forName(a);
        System.out.println(b.getMethods().length);
    }
}




